class Solution {
    public int findDuplicate(int[] nums) {
        /*int n = nums.length;
        for(int idx1 = 0; idx1 < n; idx1++) {
            for(int idx2 = idx1+1; idx2 < n; idx2++) {
                if(nums[idx1] == nums[idx2]) {
                    return nums[idx1];
                }
            }
        }

        return -1;*/

        /*Set<Integer> seen = new HashSet<>();

        for(int num : nums) {
            if(seen.contains(num)) {
                return num;
            }
            seen.add(num);
        }

        return -1;*/

        /*for(int idx : nums) {
            idx = 3
            current = 3
            int current = Math.abs(idx);
            
            if(nums[current] < 0) {
                return current;
            }

            nums[current] *= -1;
        }

        return -1;*/

        while(nums[0] != nums[nums[0]]) {
            swap(nums, 0, nums[0]);
        }

        return nums[0];
    }

    private void swap(int[] nums, int idx1, int idx2) {
        int temp = nums[idx1];
        nums[idx1] = nums[idx2];
        nums[idx2] = temp;
    }
}